package com.bigdata.quality.config.enums;

import com.bigdata.quality.config.exception.DatabaseTypeException;
import lombok.Getter;

@Getter
public enum DatabaseEnums {
  FLINK("flink", "Flink", "Flink Table", "org.apache.flink.api.java.ExecutionEnvironment"),

  /**
   * MySQL 数据库
   */
  MYSQL("mysql", "MySQL", "MySQL数据库", "com.mysql.cj.jdbc.Driver"),

  /**
   * Oracle 数据库
   */
  ORACLE("oracle", "Oracle", "Oracle数据库", "oracle.jdbc.driver.OracleDriver"),

  /**
   * PostgreSQL 数据库
   */
  POSTGRE_SQL("pg", "PostgreSQL", "PostgreSQL数据库", "org.postgresql.Driver"),

  /**
   * SQL Server 数据库
   */
  SQL_SERVER("mssql", "SQLServer", "SQL Server数据库", "com.microsoft.sqlserver.jdbc.SQLServerDriver"),

  /**
   * SQLite 数据库
   */
  SQLITE("sqlite", "SQLite", "SQLite嵌入式数据库", "org.sqlite.JDBC"),

  /**
   * MongoDB 文档数据库
   */
  MONGO_DB("mongo", "MongoDB", "MongoDB文档数据库", "mongodb.jdbc.MongoDriver"),

  /**
   * Redis 内存数据库
   */
  REDIS("redis", "Redis", "Redis内存数据库", ""), // Redis通常不使用JDBC驱动

  /**
   * H2 内存数据库
   */
  H2("h2", "H2", "H2内存数据库", "org.h2.Driver"),

  /**
   * ClickHouse 列式数据库
   */
  CLICK_HOUSE("ck", "ClickHouse", "ClickHouse列式数据库", "ru.yandex.clickhouse.ClickHouseDriver"),

  /**
   * Elasticsearch 搜索引擎
   */
  ELASTIC_SEARCH("es", "Elasticsearch", "Elasticsearch搜索引擎", ""), // ES通常不使用JDBC驱动

  /**
   * TiDB 分布式数据库
   */
  TI_DB("tidb", "TiDB", "TiDB分布式数据库", "com.mysql.cj.jdbc.Driver"), // TiDB兼容MySQL协议

  /**
   * OceanBase 分布式数据库 这里默认OBMSQL类型
   */
  OCEAN_BASE("ob", "OceanBase", "OceanBase分布式数据库", "com.mysql.cj.jdbc.Driver"), // GreatDB兼容MySQL协议

  /**
   * GreatDB 分布式数据库
   */
  GREAT_DB("greatdb", "GreatDB", "GreatDB分布式数据库", "com.mysql.cj.jdbc.Driver"), // GreatDB兼容MySQL协议

  /**
   * Hive2 数据仓库
   */
  HIVE2("hive2", "Hive2", "Hive2数据仓库", "org.apache.hive.jdbc.HiveDriver"),

  /**
   * Apache Doris 分析型数据库
   */
  DORIS("doris", "Doris", "Apache Doris分析型数据库", "com.mysql.cj.jdbc.Driver"); // Doris兼容MySQL协议

  /**
   * 数据库编码（简写）
   */
  private final String code;

  /**
   * 数据库名称（英文全写）
   */
  private final String name;

  /**
   * 数据库中文描述
   */
  private final String desc;

  private final String driverClassName;

  /**
   * 私有构造方法
   *
   * @param code            数据库编码
   * @param name            数据库名称（英文）
   * @param desc            数据库中文描述
   * @param driverClassName JDBC驱动类名
   */
  DatabaseEnums(String code, String name, String desc, String driverClassName) {
    this.code = code;
    this.name = name;
    this.desc = desc;
    this.driverClassName = driverClassName;
  }

  /**
   * 根据编码查找枚举
   *
   * @param code 数据库编码
   * @return 对应的枚举值，未找到抛出异常
   */
  public static DatabaseEnums fromCode(String code) {
    if (code == null || code.isEmpty()) {
      throw new DatabaseTypeException("DatabaseEnums check, 编码不能为空.");
    }
    for (DatabaseEnums db : values()) {
      if (db.getCode().equalsIgnoreCase(code)) {
        return db;
      }
    }
    throw new DatabaseTypeException("DatabaseEnums check, 不支持的数据源类型.");
  }

  /**
   * 根据名称查找枚举
   *
   * @param name 数据库名称（英文）
   * @return 对应的枚举值，未找到抛出异常
   */
  public static DatabaseEnums fromName(String name) {
    if (name == null || name.isEmpty()) {
      throw new DatabaseTypeException("DatabaseEnums check, 名称不能为空");
    }
    for (DatabaseEnums db : values()) {
      if (db.getName().equalsIgnoreCase(name)) {
        return db;
      }
    }
    throw new DatabaseTypeException("DatabaseEnums check, 不支持的数据源类型.");
  }
}